package cn.linran.service.impl;

import cn.linran.domain.MovieTicket;
import cn.linran.domain.User;
import cn.linran.domain.UserTicket;
import cn.linran.exception.GlobalCustomException;
import cn.linran.feign.UserFeignClient;
import cn.linran.mapper.MovieTicketMapper;
import cn.linran.mapper.UserTicketMapper;
import cn.linran.result.JSONResult;
import cn.linran.service.IMovieTicketService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author director
 * @since 2022-08-29
 */
@Service
public class MovieTicketServiceImpl extends ServiceImpl<MovieTicketMapper, MovieTicket> implements IMovieTicketService {
    @Autowired
    private MovieTicketMapper movieTicketMapper;

    @Autowired
    private UserTicketMapper userTicketMapper;

    @Autowired
    private UserFeignClient userFeignClient;

    /**
     * 通过id观看电影：
     * 根据电影Id，查询用户是否拥有此电影票，电影票是否过期，过期提示不可观看
     * @param id
     */
    @Override
    public void watchById(Long id) {
        //1 根据电影Id，查询用户是否拥有此电影票
        //1.1 根据电影票id，查询是否有用户拥有
        //1.2 查询user和ticket中间表
        UserTicket userTicket = userTicketMapper.selectByTicketId(id);


        if(userTicket.getUserId()!=null){//如果能根据电影票查到用户，说明该用户买过
            //2 电影票是否过期过期提示不可观看，没有过期更新数据库为status1（用过）
            //2.1 根据id查询到电影票对象
            MovieTicket movieTicket = movieTicketMapper.selectById(id);
            Date nowDate = new Date();
            if (movieTicket.getEndTime().compareTo(nowDate)<0) {//观看时间过期
                //2.2 说明过期，抛异常
                throw new GlobalCustomException("-1000","观看时间过期，不可观看！");
            }else{
                //2.3 观看时间没过期，但是看过了，抛异常看过了无法再次观看
            }
        }

        //2.5将状态设置成1，修改数据库
        userTicket.setStatus("1");
        userTicketMapper.updateById(userTicket);

    }






    /**
     * 通过id购买票
     * @param id
     */
    @Transactional
    @Override
    public JSONResult buyById(Long id) {
        MovieTicket movieTicket = movieTicketMapper.selectById(id);
        //  1、判断判断库存是否足够，如果不足响应提示.足够减一个库存,保存修改
        if(movieTicket.getStock()<=0){
            throw new GlobalCustomException("票数不足！");
        }
        // 1.1 、电影票减少一个库存
        movieTicket.setStock(movieTicket.getStock()-1);
        // 1.2、保存电影票修改
        movieTicketMapper.updateById(movieTicket);



//        // 2、（假设是1号张三买的），减去用户余额,保存修改用户
//        JSONResult jsonResult1 = userFeignClient.get(1l);//jsonResult1中有user
//        // 使用ObjectMapper取出user
//        ObjectMapper objectMapper = new ObjectMapper();
//        User user = objectMapper.convertValue(jsonResult1.getData(), User.class);
//        //User user = (User) data;//强制转化成user
//        // 2.1、获取该票价格
//        BigDecimal movieTicketPrice = movieTicket.getPrice();
//        // 2.2、用户余额-电影票价格
//        BigDecimal newBalance = user.getBalance().subtract(movieTicketPrice) ;
//        // 2.3、剩余余额存入user
//        user.setBalance(newBalance);
//        //2.4、更新user（余额）
//        userFeignClient.saveOrUpdate(user);


        //  3、保存电影票中间表，是否使用为0否
        UserTicket userTicket = new UserTicket();
        userTicket.setUserId(1L);//设置用户id
        userTicket.setMovieTicketId(id);//设置票id
        userTicket.setStatus("0");//设置状态为未使用
        userTicketMapper.insert(userTicket);//更新数据库

        return JSONResult.success(movieTicket.getPrice());

    }


}
